#include <stdio.h>
#include <stdlib.h>

#define DEBUG true // 第2条语句
void main()
{
    int i = 555;
    // …….// 程序
    printf("123\n");
#ifdef DEBUG                                //第7条语句
    printf("DEBUG: value of i is %d\n", i); // 第8条语句
#endif

#if DEBUG == true
    printf("#if %d\n", i);
#endif

    getchar();
    // system("pause");
}

/*
嵌入指令“#include”
    嵌入指令“#include”指示编译器将一个源文件嵌入到带有“#include”指令的源文件中该指令所在的位置处。
    尖括号或双引号中的文件名可含有路径信息。
        #include<＼user＼prog.h>
            由于编译指令不是C的一部分，
            因此，在这里表示反斜杠时只使用一个反斜杠。

            如果在C程序中表示上述文件名，则必须使用双反斜杠。
            char fname ［］="＼＼user＼＼prog.h";

    预处理器提供的文件包含能力不仅减少了重复性工作，
    而且如果因宏定义出错或者某种原因需要修改某些宏定义语句时，
    只需对相应宏定义进行修改即可，
    不必对使用这些宏定义的各个程序文件分别进行修改。

条件编译
    C语言的预处理器还提供了条件编译功能，
    它使得同一程序在不同的编译条件下能够产生不同的目标代码文件。
    条件编译有时能够帮助解决程序的可移植性问题，
    也便于对程序进行调试。

    #ifdef、#endif和#else语句

    #if语句


头文件的内容安排可以遵循如下原则。
    1）头文件里只写不实际生成的代码和不导致实际分配存储的描述。
    2）可以包括各种公用宏定义，但尽量少用宏定义。
    3）只用文件包含命令（#include）包含头文件，不用它包含程序文件。
    4）通过头文件能解决在一个程序文件里定义，而在另一个程序文件里使用的信息传递问题。

程序物理组织
    正如函数分解一样，文件的分解也没有万能的准则。
    一般可以首先划分源文件，从如下两个方面来考虑。
        1）首先初步估计程序的大小，将源文件划分为几块。
        随着程序开发的进行，再根据实际情况合理调整。
        2）根据程序实现的功能，将其划分为几块。
        一般将具有一定的整体性的功能放在一起，建立一个程序文件。

一般可以参考如下原则决定头文件的数量和编写内容。
    1）把所有公用的类型定义、公用的结构、联合或枚举声明及共用的宏定义放在适当的头文件里，提供给各个文件参考。
    2）如果在许多地方都使用同一个标准头文件，或者某个头文件本身需要，则可以把它们写在一个自己定义的头文件里面供这些文件使用。
    3）如果只有一个文件需要某个标准头文件，则不要将它放在公共的头文件中，而是让这个源程序文件直接包含它，以提高编译效率。
    4）对于所有在一个源文件里定义而在其他文件中使用的函数或变量，都需要在某个头文件里声明（函数原型或者变量的外部声明）。

避免对头文件的重复编译
    因为一个程序文件可能包含多个头文件，由此可能引起同一个头文件的重复包含问题。
    对头文件使用预处理命令可以避免这一问题

*/